
; Вход
;	R0 - адрес спрайта в памяти процессора
;	R1 - адрес спрайта в видеопамяти
;	R2 - ширина спрайта в пикселях
;	R3 - высота спрайта в пикселях
function put_sprite_640x480x32
assign	r4	X
assign	r5	NEXT_LINE_ADDER
assign	r6	DOT
assign	R7	WIDTH

;debug
	load	NEXT_LINE_ADDER, 2560		; Количество точек на экране по ширине (в байтах - 640x4bpp)
	mov	WIDTH, r2			; Сохранение ширмны спрайта
	shl	WIDTH, 2			; Умножаем ширина на 4 бита на пиксель
	clc
	subc	NEXT_LINE_ADDER, WIDTH		; Обновляем шаг от последней точки в строке спрайта до первой точки следующей строки
	shr	WIDTH, 2			; Возвращаем ширину к словам
loop_y:
	mov	X, WIDTH			; X это регистр счётчик. Считает количество точке до конца строки
loop_x:
	mov	DOT, (r0)			; Чтение точки из памяти процессора
	mov	(r1), DOT			; Запись чтоки в видеопамять памяти
	inc	r0, 4				; К следующей точке в памяти процессора
	inc	r1, 4				; К следующей точке в видеопамяти
	dec	X				; Уменьшение счётчика оставшихся в строке символов
	jnz	loop_x  
	dec	r3				; Подсчёт оставшегося количества строк
	jz	exit
	clc ; А он тут не нужен, спорим?
	addc	r1, NEXT_LINE_ADDER		; Переход к следующей строке
	jmp	loop_y
exit:	
; send
	return
end

; Вход
;	R0 - адрес спрайта в видеопамяти
;	R1 - адрес спрайта в памяти процессора
;	R2 - ширина спрайта в пикселях
;	R3 - высота спрайта в пикселях
function get_sprite_640x480x32
assign	r4	X
assign	r5	NEXT_LINE_ADDER
assign	r6	DOT
assign	R7	WIDTH
	load	NEXT_LINE_ADDER, 2560		; Количество точек на экране по ширне
	mov	WIDTH, r2			; Сохранение ширмны спрайта
	shl	WIDTH, 2			; Умножаем ширина на 4 бита на пиксель
	clc
	subc	NEXT_LINE_ADDER, WIDTH		; Обновляем шаг от последней точки в строке спрайта до первой точки следующей строки
	shr	WIDTH, 2			; Возвращаем ширину к словам
loop_y:
	mov	X, WIDTH			; X это регистр счётчик. Считает количество точке до конца строки
loop_x:
	mov	DOT, (r0)			; Чтение точки из памяти процессора
	mov	(r1), DOT			; Запись чтоки в видеопамять памяти
	inc	r0, 4				; К следующей точке в памяти процессора
	inc	r1, 4				; К следующей точке в видеопамяти
	dec	X				; Уменьшение счётчика оставшихся в строке символов
	jne	loop_x  
	dec	r3				; Подсчёт оставшегося количества строк
	jz	exit
	clc
	addc	r0, NEXT_LINE_ADDER		; Переход к следующей строке
	jmp	loop_y
exit:
	return
end
